<?php

namespace App\Modules\Admin\Http\Controllers;

use App\Models\UploadFile;
use Illuminate\Http\Request;

class UploadController extends BaseController
{
    /**
     * 上传图片
     * @param Request $request 网络请求
     * @return array
     * @since 2020/11/11
     */
    public function uploadImage(Request $request)
    {
        // 检测请求中是否包含name=$form_name的上传文件
        if (!$request->hasFile("file")) {
            return $this->errorJson('请上传文件！');
        }
        // 文件对象
        $file = $request->file("file");
        // 判断图片上传是否错误
        if (!$file->isValid()) {
            // 文件上传失败
            return $this->errorJson('上传文件验证失败！');
        }
        // 文件原名
        $original_name = $file->getClientOriginalName();
        // 文件扩展名(文件后缀)
        $ext = $file->getClientOriginalExtension();
        // 临时文件的绝对路径
        $real_path = $file->getRealPath();
        // 文件类型
        $type = $file->getClientMimeType();
        // 文件大小
        $size = $file->getSize();

        // 文件大小校验
        if ($size > 10*1024*1024) {
            return $this->errorJson('文件大小超过了5M！');
        }

        // 文件后缀校验
        $ext_arr = array('jpg', 'jpeg', 'png', 'gif');
        if (!in_array($ext, $ext_arr)) {
            return $this->errorJson('文件格式不正确！');
        }

        // 文件路径
        $file_dir = UPLOAD_TEMP_PATH . "/" . date('Ym');

        // 检测文件路径是否存在,不存在则创建
        if (!file_exists($file_dir)) {
            mkdir($file_dir, 0777, true);
        }

        // 文件名称
        $file_name = date('Y-m-d').uniqid() . '.' . $ext;
        // 重命名保存
        $path = $file->move($file_dir, $file_name);
        // 文件临时路径
        $file_path = str_replace(ATTACHMENT_PATH, '', $file_dir) . '/' . $file_name;

        // 文件路径
        if (!$file_path) {
            return $this->errorJson('文件上传失败！');
        }

        // 网络域名拼接
        if (strpos($file_path, IMG_URL) === false) {
            $file_path = IMG_URL . $file_path;
        }
        // 返回结果
        $result = [
            'img_original_name' => $original_name,
            'img_ext' => $ext,
            'img_real_path' => $real_path,
            'img_type' => $type,
            'img_size' => $size,
            'img_name' => $file_name,
            'img_path' => $file_path,
        ];
        // 添加文件库记录
        $uploadFile = $this->addUploadFile($result);

        // 返回结果
        return $this->successJson($path, '上传成功', ['file_url' => $uploadFile->file_url]);

    }

    /**
     * 文件上传
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  string                    $file
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function file(Request $request, $file = 'file')
    {
        if (empty($request->file($file))){
            return $this->errorJson('请上传文件！');
        }

         var_dump($request->file($file)->getClientOriginalExtension());
         var_dump($request->file($file)->getMimeType());
         var_dump($request->file($file)->getType());
         var_dump($request->file($file)->getClientMimeType());
         exit;

        $path = $request->file($file)->storePublicly(
            date('Ym'),
            config('filesystems')
        );

        // 添加文件库记录
        $uploadFile = $this->addUploadFile($path, $request->file($file));

        return $this->successJson($path, '上传成功', ['file_url' => $uploadFile->file_url]);
    }

    /**
     * 添加文件库上传记录
     * @param $fileName
     * @param $fileInfo
     * @param $fileType
     * @return UploadFile
     */
    private function addUploadFile($result)
    {
        // 存储引擎
        $storage = 'local';
        // 存储域名
        $host_url = '';
        // 添加文件库记录
        return UploadFile::create([
            'storage' => $storage,
            'host_url' => $host_url,
            'file_path' => $result['img_path'],
            'file_name' => $result['img_name'],
            'file_original_name' => $result['img_original_name'],
            'file_size' => $result['img_size'],
            'file_type' => $result['img_type'],
            'extension' => $result['img_ext'],
        ]);
    }
}
